Skill

সার্ভিস এবং ডিপেন্ডেন্সি ইনজেকশন

Web Development - অ্যাঙ্গুলার (Angular) -

Angular-এ সার্ভিস এবং ডিপেন্ডেন্সি ইনজেকশন (DI) অত্যন্ত গুরুত্বপূর্ণ ধারণা, যা অ্যাপ্লিকেশনটির কাঠামো এবং কন্ট্রোলের জন্য অপরিহার্য। এটি অ্যাপ্লিকেশনগুলিকে আরও মডুলার, স্কেলেবল, এবং টেস্টেবল করে তোলে।

সার্ভিস (Service)

সার্ভিস হল একটি ক্লাস যা সাধারণত অ্যাপ্লিকেশনের ব্যবসায়িক লজিক বা ডেটা ম্যানিপুলেশন সম্পাদন করে। Angular-এ সার্ভিস ব্যবহার করা হয় যাতে কম্পোনেন্টগুলো থেকে অপ্রয়োজনীয় লজিক এবং ডেটা ম্যানেজমেন্ট আলাদা করা যায়। এতে কোড পুনরায় ব্যবহৃত হতে পারে এবং অ্যাপ্লিকেশনের ভেতরে ডেটা শেয়ার করা সহজ হয়। Angular সার্ভিসগুলো Singleton (একক ইন্সট্যান্স) হিসেবে কাজ করে, অর্থাৎ সার্ভিসের একটিমাত্র ইন্সট্যান্স তৈরি হয় এবং তা অ্যাপ্লিকেশনের বিভিন্ন অংশে শেয়ার করা হয়।


সার্ভিস তৈরি

একটি সাধারণ সার্ভিস তৈরি করতে Angular CLI ব্যবহার করা যেতে পারে:

ng generate service user

এটি user.service.ts নামের একটি সার্ভিস ফাইল তৈরি করবে।

import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root', // সার্ভিসটি অ্যাপ্লিকেশন জুড়ে একক ইন্সট্যান্স হিসেবে ব্যবহার হবে
})
export class UserService {

  constructor() { }

  getUser() {
    return { name: 'John Doe', age: 30 };
  }
}

এখানে, @Injectable ডেকোরেটরটি Angular-কে জানিয়ে দেয় যে এই ক্লাসটি একটি সার্ভিস এবং এটি Dependency Injection এর মাধ্যমে ইনজেক্ট করা যেতে পারে। providedIn: 'root' নির্দেশ করে যে সার্ভিসটি অ্যাপ্লিকেশন জুড়ে একক ইন্সট্যান্স হিসেবে ব্যবহৃত হবে।


ডিপেন্ডেন্সি ইনজেকশন (Dependency Injection)

ডিপেন্ডেন্সি ইনজেকশন (DI) হল একটি ডিজাইন প্যাটার্ন, যার মাধ্যমে Angular অ্যাপ্লিকেশন অবজেক্টগুলির ডিপেন্ডেন্সি সরবরাহ করে। Angular DI কন্টেইনারের মাধ্যমে সার্ভিসগুলো ইনজেক্ট করে, যার ফলে কোড আরো মডুলার এবং টেস্টযোগ্য হয়। এর ফলে, কম্পোনেন্টগুলিকে ডিপেন্ডেন্সি বা সার্ভিস তাদের কনস্ট্রাক্টরে ইনজেক্ট করা যায়।

DI কাজের প্রক্রিয়া:

  1. কম্পোনেন্ট বা সার্ভিসে সার্ভিস ইনজেক্ট করা: Angular জানে যে কিভাবে একটি সার্ভিস ইনজেক্ট করতে হয় কারণ সার্ভিসে @Injectable ডেকোরেটর দেওয়া থাকে। এই ডেকোরেটরের মাধ্যমে Angular সার্ভিসটির ইন্সট্যান্স তৈরি করে এবং তা ব্যবহারকারী কম্পোনেন্ট বা সার্ভিসে ইনজেক্ট করে।
  2. এনজেকশন কন্টেইনার: Angular একটি DI কন্টেইনার ব্যবহার করে, যা সমস্ত সার্ভিস এবং ডিপেন্ডেন্সির ইন্সট্যান্স ধারণ করে।

ডিপেন্ডেন্সি ইনজেকশন ব্যবহার

ধরা যাক, UserService সার্ভিসকে AppComponent-এ ইনজেক্ট করতে চান।

কম্পোনেন্ট (TypeScript):

import { Component } from '@angular/core';
import { UserService } from './user.service'; // সার্ভিস ইমপোর্ট করা

@Component({
  selector: 'app-root',
  template: `<h1>{{ user.name }}</h1>`
})
export class AppComponent {
  user: any;

  constructor(private userService: UserService) {  // সার্ভিস ইনজেক্ট করা
    this.user = this.userService.getUser(); // সার্ভিসের মেথড কল করা
  }
}

এখানে, UserService সার্ভিসটি AppComponent-এ ইনজেক্ট করা হয়েছে constructor-এর মাধ্যমে। Angular DI কন্টেইনার স্বয়ংক্রিয়ভাবে UserService ইন্সট্যান্স তৈরি করে এবং এটি কম্পোনেন্টে সরবরাহ করে।


DI কনফিগারেশন এবং স্কোপ

  1. Root Scope: সার্ভিসটি পুরো অ্যাপ্লিকেশনে একক ইন্সট্যান্স হিসেবে ব্যবহৃত হলে, সার্ভিসকে providedIn: 'root' এর মাধ্যমে কনফিগার করা হয়।
  2. Feature Scope: যদি সার্ভিসটি নির্দিষ্ট মডিউল বা ফিচারের মধ্যে সীমাবদ্ধ রাখতে চান, তবে সেই মডিউলটিতে providers অ্যারে ব্যবহার করে সার্ভিস প্রদান করতে পারেন।
@NgModule({
  declarations: [...],
  imports: [...],
  providers: [UserService], // সার্ভিস শুধুমাত্র এই মডিউলে ব্যবহার হবে
  bootstrap: [AppComponent]
})
export class FeatureModule { }

এখানে UserService শুধুমাত্র FeatureModule মডিউলে ইনজেক্ট করা যাবে।


সার্ভিসের ব্যবহার

একটি সার্ভিসে সাধারণত বিজনেস লজিক এবং ডেটা ম্যানিপুলেশন কোড রাখা হয়, যা একাধিক কম্পোনেন্ট বা অন্যান্য সার্ভিসে পুনঃব্যবহার করা যায়।

উদাহরণ:

  1. API কল করার সার্ভিস:
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class ApiService {

  constructor(private http: HttpClient) { }

  getData(): Observable<any> {
    return this.http.get('https://api.example.com/data');
  }
}
  1. কম্পোনেন্টে সার্ভিস ব্যবহার:
import { Component, OnInit } from '@angular/core';
import { ApiService } from './api.service';

@Component({
  selector: 'app-data',
  template: `<div>{{ data | json }}</div>`
})
export class DataComponent implements OnInit {
  data: any;

  constructor(private apiService: ApiService) {}

  ngOnInit() {
    this.apiService.getData().subscribe(data => {
      this.data = data;
    });
  }
}

এখানে ApiService ব্যবহার করে অ্যাসিঙ্ক্রোনাসভাবে ডেটা ফেচ করা হচ্ছে এবং Angular DI ব্যবস্থার মাধ্যমে সার্ভিসটি ইনজেক্ট করা হয়েছে।


সার্ভিসের স্কোপ এবং লিফটাইফ

Angular-এ সার্ভিসের স্কোপ এবং লিফটাইফ সম্পর্কে ধারণা রাখা খুবই গুরুত্বপূর্ণ। স্কোপ অনুযায়ী সার্ভিসটি অ্যাপ্লিকেশন জুড়ে একক ইন্সট্যান্স হবে বা নির্দিষ্ট মডিউলের মধ্যে থাকবে। এটি অ্যাপ্লিকেশনের স্থিতি এবং কর্মক্ষমতা উন্নত করতে সাহায্য করে।

Content added By

সার্ভিস তৈরি এবং ব্যবহার

Angular-এ সার্ভিস হল এমন একটি ক্লাস যা কম্পোনেন্ট, ডিরেক্টিভ, বা অন্যান্য সার্ভিসের মধ্যে পুনঃব্যবহারযোগ্য লজিক এবং ডেটা সরবরাহ করে। সার্ভিস সাধারণত অ্যাপ্লিকেশন লেভেলের ডেটা ম্যানেজমেন্ট, HTTP কল, ফর্ম ভ্যালিডেশন বা অন্যান্য কাজে ব্যবহৃত হয়। Angular সার্ভিসের একটি গুরুত্বপূর্ণ বৈশিষ্ট্য হল ডিপেন্ডেন্সি ইনজেকশন (Dependency Injection, DI), যার মাধ্যমে সার্ভিসগুলিকে কম্পোনেন্ট বা অন্যান্য সার্ভিসে ইনজেক্ট করা হয়।


সার্ভিস তৈরি করা

Angular-এ সার্ভিস তৈরি করার জন্য, আমরা সাধারণত CLI ব্যবহার করি, যেটি কোড জেনারেট করতে দ্রুত এবং সহজ উপায় প্রদান করে।

সার্ভিস তৈরি করার CLI কমান্ড:

ng generate service user

এটি user.service.ts নামের একটি সার্ভিস ফাইল তৈরি করবে, যেখানে আমরা আমাদের সার্ভিসের লজিক লিখতে পারব।

সার্ভিসের উদাহরণ:

import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root'  // সার্ভিসটি রুট লেভেলে ইনজেক্ট হবে
})
export class UserService {

  constructor() { }

  getUserData() {
    return { name: 'John Doe', age: 30 };
  }

  saveUserData(user: any) {
    console.log('User data saved:', user);
  }
}

এখানে:

  • @Injectable ডেকোরেটরটি Angular-কে জানিয়ে দেয় যে এই ক্লাসটি একটি সার্ভিস এবং এটি ইনজেকশনের জন্য প্রস্তুত।
  • providedIn: 'root' নির্দেশ করে যে সার্ভিসটি অ্যাপ্লিকেশন জুড়ে একটি একক ইন্সট্যান্স (singleton) হিসেবে ব্যবহৃত হবে।

সার্ভিস ব্যবহার করা

একবার সার্ভিস তৈরি হলে, আপনি এটি Angular কম্পোনেন্ট, ডিরেক্টিভ, অথবা অন্য সার্ভিসে ব্যবহার করতে পারেন। সার্ভিসে getUserData() এবং saveUserData() ফাংশন রয়েছে, এখন এই সার্ভিসকে একটি কম্পোনেন্টে ইনজেক্ট করা যাক।

সার্ভিস ইনজেক্ট করা:

প্রথমে, কম্পোনেন্টে সার্ভিসটি ইনজেক্ট করতে হবে:

import { Component } from '@angular/core';
import { UserService } from './user.service';  // সার্ভিস ইমপোর্ট

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
})
export class AppComponent {
  user: any;

  constructor(private userService: UserService) { }

  ngOnInit() {
    this.user = this.userService.getUserData();
  }

  saveData() {
    this.userService.saveUserData(this.user);
  }
}

এখানে:

  • UserService ইনজেক্ট করা হয়েছে কম্পোনেন্টের কনস্ট্রাক্টরের মাধ্যমে।
  • getUserData() ফাংশনটি সার্ভিস থেকে ইউজারের ডেটা নিয়ে এসেছে এবং কম্পোনেন্টে প্রদর্শন করা হয়েছে।
  • saveData() ফাংশনটি সার্ভিসের saveUserData() ফাংশনকে কল করছে, যা ইউজারের ডেটা কনসোলে লগ করে।

HTML টেমপ্লেট:

<h1>User Data</h1>
<p>Name: {{ user.name }}</p>
<p>Age: {{ user.age }}</p>

<button (click)="saveData()">Save User Data</button>

এখানে, ইউজারের নাম এবং বয়স প্রদর্শিত হচ্ছে এবং একটি বাটনে ক্লিক করলে saveData() ফাংশনটি কল হয়ে সার্ভিসের মাধ্যমে ডেটা সেভ হবে।


সার্ভিসের বেনিফিট

  1. ডেটা শেয়ারিং: একাধিক কম্পোনেন্টে একই ডেটা শেয়ার করা সহজ হয়।
  2. কোড রিইউজেবিলিটি: সার্ভিসগুলির মাধ্যমে কোডকে পুনঃব্যবহারযোগ্য করা যায়, তাই একই লজিক বা ডেটা ব্যবহারের জন্য বারবার কোড লেখার প্রয়োজন নেই।
  3. টেস্টেবিলিটি: সার্ভিসগুলি সহজে টেস্ট করা যায়, কারণ এগুলি সাধারণত ইনপুট-আউটপুট ভিত্তিক এবং বাইরের ডিপেন্ডেন্সির উপর নির্ভর করে না।

সার্ভিসের ডিপেন্ডেন্সি ইনজেকশন

Angular-এ ডিপেন্ডেন্সি ইনজেকশন (DI) ব্যবহারের মাধ্যমে সার্ভিসগুলিকে কম্পোনেন্টে ইনজেক্ট করা হয়। DI নিশ্চিত করে যে প্রতিটি কম্পোনেন্ট বা সার্ভিস তাদের প্রয়োজনীয় সার্ভিস বা ডিপেন্ডেন্সি অ্যাঙ্গুলার রাউটার বা অন্যান্য অংশ থেকে সহজে পেয়ে যাবে।

DI এর উদাহরণ:

যদি আপনি দুটি সার্ভিসকে ইনজেক্ট করতে চান, তাহলে কনস্ট্রাক্টরের মাধ্যমে তা করা হয়:

import { Component } from '@angular/core';
import { UserService } from './user.service';
import { ProductService } from './product.service';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html'
})
export class AppComponent {
  constructor(private userService: UserService, private productService: ProductService) { }

  ngOnInit() {
    console.log(this.userService.getUserData());
    console.log(this.productService.getProductList());
  }
}

এখানে, UserService এবং ProductService দুটো সার্ভিসকে একসাথে ইনজেক্ট করা হয়েছে।


সার্ভিসে HTTP কল ব্যবহার

এছাড়া, সার্ভিসে HTTP কল করার জন্য HttpClient ব্যবহার করা যায়। HTTP কলের মাধ্যমে সার্ভিসটি অ্যাপ্লিকেশন থেকে সার্ভারের সঙ্গে ডেটা আদান-প্রদান করতে পারে। HttpClientModule ইনপোর্ট করে HTTP সার্ভিস ব্যবহার করা যায়।

HTTP সার্ভিস উদাহরণ:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Injectable({
  providedIn: 'root'
})
export class ApiService {

  constructor(private http: HttpClient) { }

  getData() {
    return this.http.get('https://api.example.com/data');
  }
}

এখানে, getData() ফাংশনটি HTTP GET রিকোয়েস্ট চালাচ্ছে এবং সার্ভার থেকে ডেটা নিয়ে আসছে।


সার্ভিসের ব্যবহার সংক্ষেপে

  1. সার্ভিস তৈরি করতে CLI ব্যবহার করুন।
  2. সার্ভিসের মাধ্যমে লজিক এবং ডেটা ম্যানেজমেন্ট পরিচালনা করুন।
  3. সার্ভিসকে DI (Dependency Injection) এর মাধ্যমে কম্পোনেন্টে ইনজেক্ট করুন।
  4. HTTP সার্ভিস ব্যবহারের জন্য HttpClient ব্যবহার করতে পারেন।
Content added By

Injectable ডেকোরেটর

Angular-এ @Injectable ডেকোরেটর একটি ক্লাসকে ইনজেকশনের জন্য প্রস্তুত করে। এটি মূলত Angular এর ডিপেন্ডেন্সি ইনজেকশন (DI) সিস্টেমের অংশ। যখন কোনো ক্লাসে @Injectable ডেকোরেটর ব্যবহার করা হয়, তখন Angular জানে যে এই ক্লাসটিকে এক বা একাধিক কম্পোনেন্ট, সার্ভিস, বা ডিরেক্টিভে ইনজেক্ট করা যেতে পারে এবং Angular নিজে তার ইনস্ট্যান্স তৈরি করে সেগুলিতে সরবরাহ করবে।


@Injectable ডেকোরেটরের ব্যবহার

@Injectable ডেকোরেটর ব্যবহার করা হয় যখন আপনি Angular এর DI সিস্টেমের মাধ্যমে সার্ভিস বা ক্লাস ইনজেক্ট করতে চান। এটি একটি ক্লাসের জন্য নির্ধারণ করে যে সেই ক্লাসটি Angular এর DI কন্টেইনারে নিবন্ধিত হবে এবং সেই ক্লাসের ইন্সট্যান্স অটোমেটিকভাবে কম্পোনেন্ট বা সার্ভিসে ইনজেক্ট হবে।

@Injectable ডেকোরেটর ব্যবহার করা

@Injectable ডেকোরেটর সাধারণত সার্ভিস ক্লাসে ব্যবহৃত হয়, তবে এটি অন্য যেকোনো ক্লাসে ব্যবহার করা যেতে পারে যেটি DI মাধ্যমে সরবরাহ করতে চান।

import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root'  // 'root' নির্দেশ করে সার্ভিসটি পুরো অ্যাপ্লিকেশন জুড়ে একটি একক ইনস্ট্যান্স হিসেবে থাকবে
})
export class MyService {

  constructor() { }

  getGreeting(): string {
    return "Hello from MyService!";
  }
}

এখানে:

  • @Injectable() ডেকোরেটরটি Angular কে জানিয়ে দেয় যে এই ক্লাসটি সার্ভিস হিসেবে ইনজেকশনযোগ্য।
  • providedIn: 'root' নির্দেশ করে যে সার্ভিসটি অ্যাপ্লিকেশনের একক (singleton) ইন্সট্যান্স হিসেবে ব্যবহৃত হবে এবং এটি অ্যাপ্লিকেশনের পুরো লাইফটাইম জুড়ে অ্যাক্সেসযোগ্য থাকবে।

@Injectable ডেকোরেটরের কনফিগারেশন

@Injectable ডেকোরেটরের মধ্যে providedIn একটি অত্যন্ত গুরুত্বপূর্ণ কনফিগারেশন। এটি নির্ধারণ করে সার্ভিসটি কোথায় ব্যবহারযোগ্য হবে। এর বিভিন্ন মান হতে পারে:

  • providedIn: 'root': সার্ভিসটি অ্যাপ্লিকেশনের সমস্ত অংশে শেয়ার করা যাবে এবং এটি একক (singleton) হিসেবে ব্যবহৃত হবে।
  • providedIn: 'any': সার্ভিসটি lazy-loaded মডিউলগুলির জন্য আলাদাভাবে তৈরি হবে। এটি তখন কেবলমাত্র সেই মডিউলে ব্যবহারযোগ্য হবে যেটি লোড হয়েছে।
  • providedIn: 'platform': সার্ভিসটি অ্যাপ্লিকেশনের সার্বিক লাইফটাইমে একাধিক ইন্সট্যান্সে প্রদত্ত হবে, এটি সাধারণত অ্যাঙ্গুলারের গভীর সার্ভিসগুলোতে ব্যবহৃত হয়।
  • providedIn: 'module': সার্ভিসটি শুধুমাত্র নির্দিষ্ট মডিউলে ইনজেক্ট করা হবে।

@Injectable ডেকোরেটরের কার্যকারিতা

@Injectable ডেকোরেটর মূলত Angular-কে জানিয়ে দেয় যে ওই ক্লাসটির জন্য ডিপেন্ডেন্সি ইনজেকশন ব্যবহার করা যাবে। যেহেতু সার্ভিস ক্লাস সাধারণত ডিপেন্ডেন্সি হিসেবে কাজ করে, Angular এই সার্ভিস ক্লাসের একটি ইন্সট্যান্স তৈরি করে এবং যখনই ওই সার্ভিসটি প্রয়োজন হয়, এটি কম্পোনেন্টে ইনজেক্ট করে দেয়।

উদাহরণ

import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root'
})
export class UserService {
  private users = ['John', 'Jane', 'Doe'];

  getUsers() {
    return this.users;
  }
}

এখানে UserService একটি সার্ভিস যা ব্যবহারকারীদের তালিকা সরবরাহ করে। এই সার্ভিসটি @Injectable ডেকোরেটর দ্বারা ইনজেকশনযোগ্য করে তোলা হয়েছে এবং এটি rootprovidedIn মান সহ মডিউলের মধ্যে উপলব্ধ।

সার্ভিস ইনজেক্ট করা

কম্পোনেন্টে এই সার্ভিস ইনজেক্ট করতে:

import { Component } from '@angular/core';
import { UserService } from './user.service';

@Component({
  selector: 'app-root',
  template: `<h1>{{ users }}</h1>`
})
export class AppComponent {
  users: string[];

  constructor(private userService: UserService) {
    this.users = this.userService.getUsers();
  }
}

এখানে:

  • UserService কে AppComponent-এ ইনজেক্ট করা হয়েছে constructor এর মাধ্যমে।
  • Angular নিজে UserService এর ইন্সট্যান্স তৈরি করেছে এবং এটি AppComponent-এ ইনজেক্ট করেছে।

সারাংশ

  • @Injectable ডেকোরেটরটি একটি ক্লাসকে ইনজেকশনযোগ্য করে তোলে।
  • এটি মূলত সার্ভিস ক্লাসে ব্যবহৃত হয় এবং Angular এর ডিপেন্ডেন্সি ইনজেকশন সিস্টেমের মাধ্যমে সেই সার্ভিসটিকে ইনজেক্ট করতে সাহায্য করে।
  • providedIn কনফিগারেশন ব্যবহার করে নির্ধারণ করা হয় সার্ভিসটি অ্যাপ্লিকেশনের কোথায় ইনজেক্ট হবে।
Content added By

হায়ারার্কিক্যাল ডিপেন্ডেন্সি ইনজেকশন

Angular এর হায়ারার্কিক্যাল ডিপেন্ডেন্সি ইনজেকশন (HDI) একটি শক্তিশালী ডিজাইন প্যাটার্ন যা সার্ভিস ইনজেকশন ব্যবস্থাকে অনেক স্তরে (hierarchical levels) সম্প্রসারণ করে। এটি Angular এর ডিপেন্ডেন্সি ইনজেকশন (DI) সিস্টেমের একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা অ্যাপ্লিকেশনের বিভিন্ন স্তরে (modules, components, services) ডিপেন্ডেন্সি ইনজেকশন নিয়ন্ত্রণ করতে সাহায্য করে। এর মাধ্যমে আপনি স্পেসিফিক স্তরে নির্দিষ্ট সার্ভিসের একটি নতুন ইন্সট্যান্স তৈরি করতে পারেন।


হায়ারার্কিক্যাল ডিপেন্ডেন্সি ইনজেকশন কী?

Angular-এর ডিপেন্ডেন্সি ইনজেকশন সিস্টেম একটি হায়ারার্কিক্যাল কাঠামোতে কাজ করে। এর মানে হলো, সার্ভিস ইনজেকশনের জন্য একটি হায়ারার্কি বা স্তর ভিত্তিক (level-based) মডেল রয়েছে যেখানে:

  1. রুট ইনজেকশন কন্টেইনার: অ্যাপ্লিকেশনের মূল স্তর, যেখানে সার্ভিসের একক ইন্সট্যান্স (singleton) ডিফাইন করা হয়।
  2. মডিউল ইনজেকশন কন্টেইনার: একটি নির্দিষ্ট মডিউল বা সাব-মডিউলে সার্ভিস সরবরাহ করা হয়।
  3. কম্পোনেন্ট ইনজেকশন কন্টেইনার: একটি নির্দিষ্ট কম্পোনেন্টে সার্ভিস ইনজেক্ট করা হয়, যেখানে সেই সার্ভিসের ইন্সট্যান্স সেই কম্পোনেন্টের জন্য পৃথক হতে পারে।

এই স্তরগুলির মধ্যে, কম্পোনেন্ট বা মডিউলে যেকোনো সার্ভিস ইনজেক্ট করা হলে, যদি সার্ভিসটি উচ্চতর স্তরে (অথবা রুট মডিউলে) ইনজেক্ট করা না থাকে, তবে এটি কম্পোনেন্ট বা মডিউলের নির্দিষ্ট স্তরে তার নিজস্ব ইন্সট্যান্স তৈরি করবে।


হায়ারার্কিক্যাল ডিপেন্ডেন্সি ইনজেকশনের সুবিধা

  1. অবজেক্টের স্কোপ নিয়ন্ত্রণ: আপনি একটি সার্ভিসের ইনস্ট্যান্সকে নির্দিষ্ট মডিউল বা কম্পোনেন্ট স্তরে স্কোপ করতে পারেন, যাতে সার্ভিসটি অন্যান্য স্তরের জন্য অ্যাক্সেসযোগ্য না হয়।
  2. ভিন্ন স্তরে সার্ভিসের বিভিন্ন ইনস্ট্যান্স: আপনি একই সার্ভিসকে বিভিন্ন স্তরে আলাদা আলাদা ইন্সট্যান্সে ব্যবহার করতে পারেন।
  3. পুনঃব্যবহারযোগ্য কোড: সার্ভিসের ইন্সট্যান্স প্যাটার্ন কন্ট্রোল করার মাধ্যমে কোড পুনঃব্যবহারযোগ্য হয় এবং এতে কোনো জটিলতা তৈরি হয় না।

হায়ারার্কিক্যাল ডিপেন্ডেন্সি ইনজেকশন এর কাজের প্রক্রিয়া

Angular একটি root injector এবং child injectors ব্যবহার করে:

  1. Root Injector: এটি অ্যাপ্লিকেশন লেভেলে ডিপেন্ডেন্সি ইনজেকশন পরিচালনা করে। যখন একটি সার্ভিস রুট কনটেইনারে ইনজেক্ট করা হয়, তখন এটি অ্যাপ্লিকেশনটির সব স্তরের জন্য একক ইন্সট্যান্স হিসাবে থাকে।
  2. Module Injector: যদি আপনি একটি সার্ভিস মডিউল স্তরে ইনজেক্ট করেন, তবে তা সেই মডিউলের কম্পোনেন্টগুলির মধ্যে শেয়ার করা হবে, তবে অন্য মডিউলের কম্পোনেন্টে এই সার্ভিসের নতুন ইন্সট্যান্স তৈরি হবে।
  3. Component Injector: আপনি যদি একটি সার্ভিস একটি কম্পোনেন্টে ইনজেক্ট করেন, তবে এটি শুধু ঐ কম্পোনেন্টের জন্য একটি পৃথক ইন্সট্যান্স তৈরি করবে।

এটি একটি ইনজেকশন হায়ারার্কি তৈরি করে, যেখানে সার্ভিসের ভিন্ন ভিন্ন স্তরের ইন্সট্যান্স তৈরি হয়, এবং এগুলি নির্দিষ্ট স্তরে লুকানো বা প্রদর্শিত হতে পারে।


উদাহরণ: হায়ারার্কিক্যাল ডিপেন্ডেন্সি ইনজেকশন

ধরা যাক, আপনার একটি LoggerService নামক সার্ভিস রয়েছে, যেটি অ্যাপের বিভিন্ন অংশে ব্যবহৃত হবে, এবং আপনি চাইছেন যে এই সার্ভিসের ইনস্ট্যান্সকে রুট, মডিউল, এবং কম্পোনেন্ট স্তরে কিভাবে কন্ট্রোল করবেন।

1. রুট স্তরে সার্ভিস ইনজেকশন

আপনি যদি সার্ভিসটিকে রুট স্তরে ইনজেক্ট করেন, তাহলে এটি অ্যাপ্লিকেশনের সব অংশে একক ইন্সট্যান্স হিসেবে ব্যবহৃত হবে।

@Injectable({
  providedIn: 'root' // রুট স্তরে ইনজেক্ট করা হচ্ছে
})
export class LoggerService {
  log(message: string) {
    console.log(message);
  }
}

2. মডিউল স্তরে সার্ভিস ইনজেকশন

যদি আপনি সার্ভিসটি একটি নির্দিষ্ট মডিউলে ইনজেক্ট করেন, তবে এটি শুধুমাত্র সেই মডিউলের কম্পোনেন্টগুলির জন্য ইনজেক্ট হবে।

@NgModule({
  providers: [LoggerService] // মডিউল স্তরে সার্ভিস ইনজেক্ট করা
})
export class AppModule { }

3. কম্পোনেন্ট স্তরে সার্ভিস ইনজেকশন

কম্পোনেন্ট স্তরে সার্ভিস ইনজেক্ট করলে, সার্ভিসটি শুধুমাত্র ঐ কম্পোনেন্টের জন্য পৃথক ইন্সট্যান্স তৈরি করবে।

@Component({
  selector: 'app-home',
  providers: [LoggerService] // কম্পোনেন্ট স্তরে সার্ভিস ইনজেক্ট করা
})
export class HomeComponent {
  constructor(private logger: LoggerService) {}
}

এখানে, LoggerService কেবলমাত্র HomeComponent এর মধ্যে ইনজেক্ট হবে এবং এটি অন্য কম্পোনেন্টে আলাদা ইন্সট্যান্স হবে।


সারাংশ

Angular এর হায়ারার্কিক্যাল ডিপেন্ডেন্সি ইনজেকশন আপনাকে সার্ভিসের ইন্সট্যান্সের জীবনচক্র এবং স্কোপ কন্ট্রোল করতে দেয়, যা কোডের রক্ষণাবেক্ষণ এবং পুনঃব্যবহারযোগ্যতা বৃদ্ধি করে। এটি রুট, মডিউল এবং কম্পোনেন্ট স্তরে ইনজেকশন নিয়ন্ত্রণ করতে সহায়ক, এবং প্রয়োজনে একই সার্ভিসের ভিন্ন ভিন্ন ইন্সট্যান্স তৈরি করার সুবিধা দেয়।

Content added By

সিঙ্গেলটন সার্ভিসেস

Angular-এ সিঙ্গেলটন সার্ভিস হল এমন একটি সার্ভিস, যা একটি অ্যাপ্লিকেশনের জীবনকাল (lifetime) জুড়ে শুধুমাত্র একটি একক ইনস্ট্যান্স তৈরি করে এবং তা একাধিক কম্পোনেন্ট বা সার্ভিসের মধ্যে শেয়ার করা হয়। এই সার্ভিসটি সাধারণত অ্যাপ্লিকেশনের গ্লোবাল স্টেট বা গ্লোবাল ফাংশনালিটি প্রদান করে, যেমন ডেটা শেয়ারিং, লগিং, API কল, ইত্যাদি।

Angular ডিপেন্ডেন্সি ইনজেকশন (DI) সিস্টেমের মাধ্যমে সিঙ্গেলটন সার্ভিসগুলি কার্যকরী হয়। @Injectable() ডেকোরেটর এবং providedIn অপশন ব্যবহার করে সিঙ্গেলটন সার্ভিস তৈরি করা হয়।


সিঙ্গেলটন সার্ভিস কিভাবে কাজ করে?

Angular ডিপেন্ডেন্সি ইনজেকশন (DI) সিস্টেমের মাধ্যমে, সার্ভিসগুলো বিভিন্ন কম্পোনেন্ট বা ডিপেন্ডেন্ট ক্লাসে ইনজেক্ট করা হয়। সিঙ্গেলটন সার্ভিসের ক্ষেত্রে, DI সিস্টেম এটি নিশ্চিত করে যে, সার্ভিসটির একটিমাত্র ইনস্ট্যান্স পুরো অ্যাপ্লিকেশন জুড়ে ব্যবহৃত হবে।

@Injectable() ডেকোরেটর

@Injectable() ডেকোরেটর দিয়ে সার্ভিসটি Angular এর DI সিস্টেমে নিবন্ধিত হয়। সিঙ্গেলটন সার্ভিস তৈরি করতে providedIn অপশন ব্যবহার করা হয়, যা সার্ভিসটির স্কোপ নির্ধারণ করে।

import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root' // এটি সার্ভিসটি অ্যাপ্লিকেশনটির রুট স্কোপে ইনজেক্ট করবে, যা সিঙ্গেলটন সার্ভিস তৈরি করে
})
export class LoggingService {
  log(message: string) {
    console.log(message);
  }
}

এখানে, providedIn: 'root' মানে হচ্ছে সার্ভিসটি পুরো অ্যাপ্লিকেশন জুড়ে একমাত্র ইনস্ট্যান্সে উপলব্ধ হবে। root স্কোপে এই সার্ভিসটিকে নিবন্ধিত করা হয়, যার ফলে এটি অ্যাপ্লিকেশনের যে কোন কম্পোনেন্টে ব্যবহৃত হতে পারে।


সিঙ্গেলটন সার্ভিস ব্যবহার

এখন এই সিঙ্গেলটন সার্ভিসটি যে কোন কম্পোনেন্টে ইনজেক্ট করা যেতে পারে এবং শুধুমাত্র একটি ইনস্ট্যান্স ব্যবহার করা হবে।

উদাহরণ: সিঙ্গেলটন সার্ভিস ইনজেকশন

import { Component } from '@angular/core';
import { LoggingService } from './logging.service';

@Component({
  selector: 'app-home',
  templateUrl: './home.component.html'
})
export class HomeComponent {
  constructor(private loggingService: LoggingService) {
    this.loggingService.log('Home component loaded');
  }
}

এখানে LoggingService সিঙ্গেলটন সার্ভিসটি HomeComponent-এ ইনজেক্ট করা হয়েছে। এই সার্ভিসটি ব্যবহার করে আমরা কোনো লগ মেসেজ কনসোলে প্রিন্ট করতে পারি।

উদাহরণ: সিঙ্গেলটন সার্ভিস অন্য কম্পোনেন্টে ব্যবহার

import { Component } from '@angular/core';
import { LoggingService } from './logging.service';

@Component({
  selector: 'app-about',
  templateUrl: './about.component.html'
})
export class AboutComponent {
  constructor(private loggingService: LoggingService) {
    this.loggingService.log('About component loaded');
  }
}

এখানে, AboutComponent-এও LoggingService ইনজেক্ট করা হয়েছে। কিন্তু, যেহেতু এটি একটি সিঙ্গেলটন সার্ভিস, তাই এটি শুধুমাত্র একটি ইনস্ট্যান্স থাকবে এবং HomeComponent এবং AboutComponent উভয়ই সেই একই ইনস্ট্যান্স শেয়ার করবে।


সিঙ্গেলটন সার্ভিসের সুবিধা

  1. গ্লোবাল স্টেট ম্যানেজমেন্ট: সিঙ্গেলটন সার্ভিস ব্যবহার করে আপনি গ্লোবাল স্টেট ম্যানেজমেন্ট করতে পারেন, যেমন ইউজার তথ্য, লগিং, কনফিগারেশন সেটিংস ইত্যাদি। এক্ষেত্রে, সার্ভিসের একমাত্র ইনস্ট্যান্সটি অ্যাপ্লিকেশনের বিভিন্ন অংশে ব্যবহার করা হয়।
  2. ডেটা শেয়ারিং: অ্যাপ্লিকেশন জুড়ে একাধিক কম্পোনেন্টের মধ্যে ডেটা শেয়ার করতে সিঙ্গেলটন সার্ভিস খুবই উপকারী। উদাহরণস্বরূপ, একটি সার্ভিস ব্যবহার করে API রেসপন্স সংরক্ষণ করা এবং তা অ্যাপ্লিকেশনের বিভিন্ন অংশে প্রদর্শন করা।
  3. কার্যকারিতা এবং রক্ষণাবেক্ষণ: সিঙ্গেলটন সার্ভিসের মাধ্যমে কোডের পুনরাবৃত্তি কমে এবং কোড রক্ষণাবেক্ষণ সহজ হয়। আপনি যখন একই সার্ভিসটি একাধিক কম্পোনেন্টে ব্যবহার করবেন, তখন সার্ভিসটির মধ্যে কোনো পরিবর্তন করলে, তা পুরো অ্যাপ্লিকেশনে প্রভাব ফেলবে।
  4. অ্যাপ্লিকেশন পারফরমেন্স: যেহেতু একটিমাত্র সার্ভিস ইনস্ট্যান্স থাকবে, তাই মেমরি ব্যবহারে সাশ্রয়ী হয় এবং অ্যাপ্লিকেশনের পারফরমেন্সও উন্নত হয়।

সার্ভিসের স্কোপ কনফিগারেশন

Angular-এ সিঙ্গেলটন সার্ভিস ব্যবহারের জন্য providedIn অপশনটি ব্যবহার করা হয়। এছাড়া, যদি আপনি সার্ভিসটিকে নির্দিষ্ট মডিউলের মধ্যে সীমাবদ্ধ করতে চান, তবে এটি শুধুমাত্র ওই মডিউলের স্কোপে প্রদান করা হবে। উদাহরণস্বরূপ, যদি আপনি সার্ভিসটি কেবলমাত্র FeatureModule এ ব্যবহার করতে চান:

@Injectable({
  providedIn: FeatureModule
})
export class FeatureService {
  // সার্ভিসের কোড
}

এভাবে, এই সার্ভিসটি শুধুমাত্র FeatureModule এর মধ্যে ইনজেক্ট হবে এবং অ্যাপ্লিকেশনের অন্য কোথাও উপলব্ধ হবে না।


সারাংশ

Angular-এ সিঙ্গেলটন সার্ভিস একটি গুরুত্বপূর্ণ কনসেপ্ট যা ডিপেন্ডেন্সি ইনজেকশন ব্যবস্থাপনা ও অ্যাপ্লিকেশনের গ্লোবাল স্টেট শেয়ার করতে সাহায্য করে। এটি একাধিক কম্পোনেন্টে ব্যবহৃত হলেও, সার্ভিসটির শুধুমাত্র একটি ইনস্ট্যান্স তৈরি হয় এবং অ্যাপ্লিকেশনের পুরো জীবনকাল জুড়ে এটি ব্যবহৃত হয়।

Content added By
Promotion